home *** CD-ROM | disk | FTP | other *** search
/ 8bitfiles.net/archives / archives.tar / archives / compuserve-file-archive / 08 System Utilities / LRR200.SFX / lrr200.asm < prev    next >
Assembly Source File  |  1990-02-12  |  25KB  |  1,448 lines

  1. ; ╠ITTLE ╥ED ╥EADER/╫RITER UTILITY PACKAGE BY ├RAIG ┬RUCE, 31-╩AN-92
  2. ; ╫RITTEN FOR ├= ╚ACKING ╬ET-═AGAZINE; FOR ├-128, 1571, 1581
  3. ; ╒PGRADED FOR ╞─-2000/4000 ╚IGH ─ENSITY ═╙-─╧╙ DISKS, 08-═AR-94
  4.  
  5. .ORG $5000
  6. .OBJ "@0:LRR.BIN"
  7.  
  8. ;====JUMP TABLE AND PARAMETERS INTERFACE ====
  9.  
  10. JMP INIT╨ACKAGE ;()
  11. JMP MS─IR       ;( MS─EVICE, MS╘YPE ) : .┴┘=DIR┴DDR, .╪=DIRENT├OUNT
  12. JMP MS╥EAD      ;( MS─EVICE, MS╘YPE, START├LUSTER, LEN═╠,.┴=TRANS,.╪=CBM╠FN )
  13. JMP MS╫RITE     ;( MS─EVICE, MS╘YPE, WRITE─IRENT, .┴=TRANS, .╪=CBM╠FN )
  14. JMP MS╞LUSH     ;( MS─EVICE, MS╘YPE )
  15. JMP MS─ELETE    ;( WRITE─IRENT )
  16. JMP MS╞ORMAT    ;( MS─EVICE, MS╘YPE, .┴=LOW/HIGH─ENSITY )
  17. JMP MS┬YTES╞REE ;( ) : .┴┘╪=BYTES╞REE
  18. JMP CBM├OPY     ;( .┴=IN╠FN, .╪=OUT╠FN )
  19. JMP CBM─IRENT   ;( .┴=LFN )
  20.  
  21. .BYTE $CB,133   ;IDENTIFICATION (LOCATION PK+30)
  22. ERRNO           .BUF 1
  23. MS─EVICE        .BUF 1
  24. MS╘YPE          .BUF 1    ;$00=1571, $FF=1581 OR ╞─-2000/4000
  25. START├LUSTER    .BUF 2
  26. LEN═╠           .BUF 2    ;LENGTH MEDIUM AND LOW BYTES
  27. WRITE─IRENT     .BUF 2    ;POINTER TO DIRENT
  28. CDIR┬LOCKS      .BUF 2    ;CBM DIRENT BLOCKS
  29. CDIR╘YPE        .BUF 1    ;CBM DIRENT FILETYPE
  30. CDIR╞LEN        .BUF 1    ;CBM DIRENT FILENAME LENGTH
  31. CDIR╬AME        .BUF 16   ;CBM DIRENT FILENAME
  32.  
  33. ;====GLOBAL DECLARAIONS====
  34.  
  35. KERNEL╠ISTEN = $FFB1
  36. KERNEL╙ECOND = $FF93
  37. KERNEL╒NLSN  = $FFAE
  38. KERNEL┴CPTR  = $FFA2
  39. KERNEL├IOUT  = $FFA8
  40. KERNEL╙PINP  = $FF47
  41. KERNEL├HKIN  = $FFC6
  42. KERNEL├HKOUT = $FFC9
  43. KERNEL├LRCHN = $FFCC
  44. KERNEL├HRIN  = $FFCF
  45. KERNEL├HROUT = $FFD2
  46.  
  47. ST = $90
  48. CIA├LOCK = $DD00
  49. CIA╞LAGS = $DC0D
  50. CIA─ATA  = $DC0C
  51.  
  52. CLUSTER┬LOCK├OUNT .BUF 1        ;1 OR 2
  53. FAT┬LOCKS         .BUF 1        ;UP TO 9
  54. ROOT─IR┬LOCKS     .BUF 1        ;UP TO 14
  55. ROOT─IR┼NTRIES    .BUF 1        ;UP TO 224
  56. TOTAL╙ECTORS      .BUF 2        ;UP TO 2880
  57. FIRST╞ILE┬LOCK    .BUF 1
  58. FIRST╥OOT─IR┬LOCK .BUF 1
  59. FILE├LUSTER├OUNT  .BUF 2
  60. LAST╞AT┼NTRY      .BUF 2
  61.  
  62. BUF├YLINDER     .BUF 1
  63. BUF╙IDE         .BUF 1
  64. FAT─IRTY        .BUF 1
  65. DIR─IRTY        .BUF 14  ;FLAG FOR EACH DIRECTORY BLOCK
  66. FORMAT╨ARMS     .BUF 1
  67. SECTORS╨ER╘RACK .BYTE 9  ;DEFAULT, UP TO 18
  68.                 .BUF 4
  69. SECTORS╨ER├YL   .BYTE 18 ;DEFAULT, UP TO 36
  70.  
  71. ;====TEST ROUTINES====
  72.  
  73. MS╞ORMAT = *
  74.    LDA #$0E
  75.    STA $FF00
  76.    JSR MOUNT─ISK
  77.    LDA #0  ;CYLINDER
  78.    LDX #0  ;SIDE
  79.    JSR READ╘RACK
  80.    LDA #<TRACKBUF
  81.    LDY #>TRACKBUF
  82.    STA 1024
  83.    STY 1025
  84.    RTS
  85.  
  86. ;====HARDWARE LEVEL====
  87.  
  88. SEND╒0 = *  ;( .┴=BURST├OMMAND├ODE ) : .├╙=ERR
  89.    PHA
  90.    LDA #0
  91.    STA ST
  92.    LDA MS─EVICE
  93.    JSR KERNEL╠ISTEN
  94.    LDA #$6F
  95.    JSR KERNEL╙ECOND
  96.    LDA #"U"
  97.    JSR KERNEL├IOUT
  98.    BIT ST
  99.    BMI SEND╒0┼RROR
  100.    LDA #"0"
  101.    JSR KERNEL├IOUT
  102.    PLA
  103.    JSR KERNEL├IOUT
  104.    BIT ST
  105.    BMI SEND╒0┼RROR
  106.    CLC
  107.    RTS
  108.  
  109.    SEND╒0┼RROR = *
  110.    LDA #5
  111.    STA ERRNO
  112.    SEC
  113.    RTS
  114.  
  115. TOGGLE├LOCK = *
  116.    LDA CIA├LOCK
  117.    EOR #$10
  118.    STA CIA├LOCK
  119.    RTS
  120.  
  121. SERIAL╫AIT = *
  122.    LDA #$08
  123. -  BIT CIA╞LAGS
  124.    BEQ -
  125.    RTS
  126.  
  127. GET┬URST┬YTE = *
  128.    JSR SERIAL╫AIT
  129.    LDX CIA─ATA
  130.    JSR TOGGLE├LOCK
  131.    TXA
  132.    RTS
  133.  
  134. MOUNT─ISK = *  ;() : .├╙=ERR
  135.    LDA #%00011010
  136.    JSR SEND╒0
  137.    BCC +
  138.    RTS
  139. +  JSR KERNEL╒NLSN
  140.    BIT ST
  141.    BMI SEND╒0┼RROR
  142.    CLC
  143.    JSR KERNEL╙PINP
  144.    BIT CIA╞LAGS
  145.    JSR TOGGLE├LOCK
  146.    JSR GET┬URST┬YTE
  147.    AND #$0F
  148.    STA ERRNO
  149.    CMP #2
  150.    BCS MOUNT┼XIT
  151.    LDY #0
  152. -  JSR GET┬URST┬YTE
  153.    STA FORMAT╨ARMS,Y
  154.    INY
  155.    CPY #6
  156.    BCC -
  157.    LDA SECTORS╨ER╘RACK
  158.    ASL
  159.    STA SECTORS╨ER├YL
  160.    ;** SET INTERLEAVE TO 4 IF 1571, DON'T BOTHER FOR OTHER DRIVES
  161.    BIT MS╘YPE
  162.    BMI MOUNT┼XIT
  163.    LDA #%00001000
  164.    JSR SEND╒0
  165.    BCC +
  166.    RTS
  167. +  LDA #4
  168.    JSR KERNEL├IOUT
  169.    JSR KERNEL╒NLSN
  170.    MOUNT┼XIT = *
  171.    RTS
  172.  
  173. BUFPTR = 2
  174. SECNUM = 4
  175.  
  176. READ╘RACK = *  ;( .┴=CYLINDER, .╪=SIDE ) : TRACKBUF, .├╙=ERR
  177.    PHA
  178.    TXA
  179.    AND #$01
  180.    ASL
  181.    ASL
  182.    ASL
  183.    ASL
  184.    BIT MS╘YPE
  185.    BPL +
  186.    EOR #$10
  187. +  JSR SEND╒0
  188.    PLA
  189.    BCC +
  190.    RTS
  191. +  JSR KERNEL├IOUT      ;CYLINDER NUMBER
  192.    LDA #1               ;START SECTOR NUMBER
  193.    JSR KERNEL├IOUT
  194.    LDA SECTORS╨ER╘RACK  ;SECTOR COUNT
  195.    JSR KERNEL├IOUT
  196.    JSR KERNEL╒NLSN
  197.    SEI
  198.    CLC
  199.    JSR KERNEL╙PINP
  200.    BIT CIA╞LAGS
  201.    JSR TOGGLE├LOCK
  202.    LDA #<TRACKBUF
  203.    LDY #>TRACKBUF
  204.    STA BUFPTR+0
  205.    STY BUFPTR+1
  206.    LDA #0
  207.    STA SECNUM
  208. -  BIT MS╘YPE
  209.    BMI +
  210.    JSR GET1571┬UF╨TR
  211. +  JSR READ╙ECTOR
  212.    BCS TRACK┼XIT
  213.    INC SECNUM
  214.    LDA SECNUM
  215.    CMP SECTORS╨ER╘RACK
  216.    BCC -
  217.    CLC
  218.    JSR TOGGLE├LOCK  ;%%%
  219.    TRACK┼XIT = *
  220.    CLI
  221.    RTS
  222.  
  223. GET1571┬UF╨TR = *
  224.    LDA #<TRACKBUF
  225.    STA BUFPTR
  226.    LDX SECNUM
  227.    CLC
  228.    LDA #>TRACKBUF
  229.    ADC BUFPTR1571,X
  230.    STA BUFPTR+1
  231.    RTS
  232.  
  233. BUFPTR1571 = *
  234.    .BYTE 0,8,16,6,14,4,12,2,10
  235.  
  236. READ╙ECTOR = *  ;( BUFPTR ) : .├╙=ERR
  237.    JSR GET┬URST┬YTE
  238.    AND #$0F
  239.    STA ERRNO
  240.    CMP #2
  241.    BCC +
  242.    RTS
  243. +  LDX #2
  244.    LDY #0
  245.  
  246.    READ┬YTE = *
  247.    LDA #$08
  248. -  BIT CIA╞LAGS
  249.    BEQ -
  250.    LDA CIA├LOCK
  251.    EOR #$10
  252.    STA CIA├LOCK
  253.    LDA CIA─ATA
  254.    STA (BUFPTR),Y
  255.    INY
  256.    BNE READ┬YTE
  257.    INC BUFPTR+1
  258.    DEX
  259.    BNE READ┬YTE
  260.    RTS
  261.  
  262. OLD├LOCK = 5
  263.  
  264. WRITE╙ECTOR = *  ;( BUFPTR, .┴=CYLINDER, .╪=SIDE, .┘=SECTOR ) : .├╙=ERR
  265.    PHA
  266.    STY SECNUM
  267.    TXA
  268.    AND #$01
  269.    ASL
  270.    ASL
  271.    ASL
  272.    ASL
  273.    ORA #$02
  274.    BIT MS╘YPE
  275.    BPL +
  276.    EOR #$10
  277. +  JSR SEND╒0
  278.    PLA
  279.    BCC +
  280.    RTS
  281. +  JSR KERNEL├IOUT      ;TRACK NUMBER
  282.    LDA SECNUM           ;SECTOR NUMBER
  283.    JSR KERNEL├IOUT
  284.    LDA #1               ;SECTOR COUNT
  285.    JSR KERNEL├IOUT
  286.    JSR KERNEL╒NLSN
  287.    SEI
  288.    LDA #$40
  289.    STA OLD├LOCK
  290.    SEC
  291.    JSR KERNEL╙PINP      ;SET FOR BURST OUTPUT
  292.    SEI
  293.    BIT CIA╞LAGS
  294.    LDX #2
  295.    LDY #0
  296.  
  297.    WRITE┬YTE = *
  298.    LDA CIA├LOCK
  299.    CMP CIA├LOCK
  300.    BNE WRITE┬YTE
  301.    EOR OLD├LOCK
  302.    AND #$40
  303.    BEQ WRITE┬YTE
  304.    LDA (BUFPTR),Y
  305.    STA CIA─ATA
  306.    LDA OLD├LOCK
  307.    EOR #$40
  308.    STA OLD├LOCK
  309.    LDA #8
  310. -  BIT CIA╞LAGS
  311.    BEQ -
  312.    INY
  313.    BNE WRITE┬YTE
  314.    INC BUFPTR+1
  315.    DEX
  316.    BNE WRITE┬YTE
  317.  
  318.    CLC
  319.    JSR KERNEL╙PINP
  320.    BIT CIA╞LAGS
  321.    JSR TOGGLE├LOCK
  322.    JSR SERIAL╫AIT
  323.    LDX CIA─ATA
  324.    JSR TOGGLE├LOCK
  325.    TXA
  326.    AND #$0F
  327.    STA ERRNO
  328.    CMP #2
  329.    CLI
  330.    RTS
  331.  
  332. ;====LOGICAL SECTOR LEVEL====
  333.  
  334. INIT╨ACKAGE = *
  335.    LDA #$0E
  336.    STA $FF00
  337.    LDA #$FF
  338.    STA BUF├YLINDER
  339.    STA BUF╙IDE
  340.    LDX #13
  341. -  STA DIR─IRTY,X
  342.    DEX
  343.    BPL -
  344.    STA FAT─IRTY
  345.    CLC
  346.    RTS
  347.  
  348. SECTOR╙AVE = 5
  349.  
  350. READ┬LOCK = *  ;( .┴=CYLINDER,.╪=SIDE,.┘=SECTOR ) : .┴┘=BLK╨TR,.├╙=ERR
  351.    CMP BUF├YLINDER
  352.    BNE READ┬LOCK╨HYSICAL
  353.    CPX BUF╙IDE
  354.    BNE READ┬LOCK╨HYSICAL
  355.    DEY
  356.    TYA
  357.    ASL
  358.    CLC
  359.    ADC #>TRACKBUF
  360.    TAY
  361.    LDA #<TRACKBUF
  362.    CLC
  363.    RTS
  364.  
  365.    READ┬LOCK╨HYSICAL = *
  366.    STA BUF├YLINDER
  367.    STX BUF╙IDE
  368.    STY SECTOR╙AVE
  369.    JSR READ╘RACK
  370.    BCC READ┬LOCK╨HYSICAL╧K
  371.    LDA ERRNO
  372.    AND #$0F
  373.    CMP #11    ;DISK CHANGE
  374.    BEQ +
  375. -  LDA #$FF
  376.    STA BUF├YLINDER
  377.    STX BUF╙IDE
  378.    SEC
  379.    RTS
  380. +  JSR MOUNT─ISK
  381.    LDA BUF├YLINDER
  382.    LDX BUF╙IDE
  383.    LDY SECTOR╙AVE
  384.    BCC READ┬LOCK╨HYSICAL
  385.    JMP -
  386.  
  387.    READ┬LOCK╨HYSICAL╧K = *
  388.    LDA BUF├YLINDER
  389.    LDX BUF╙IDE
  390.    LDY SECTOR╙AVE
  391.    JMP READ┬LOCK
  392.  
  393. DIVIDE┬Y├YL╙ECS = *  ;( .┴┘=NUMBER ) : .┴=QUOTIENT, .┘=REMAINDER
  394.    LDX #$FF
  395. -  INX
  396.    SEC
  397.    SBC SECTORS╨ER├YL
  398.    BCS -
  399.    DEY
  400.    BPL -
  401.    CLC
  402.    ADC SECTORS╨ER├YL
  403.    INY
  404.    TAY
  405.    TXA
  406.    RTS
  407.  
  408. CONVERT╠OGICAL┬LOCK╬UM = *  ;( .┴┘=BLOCK╬UM ) : .┴=CYL, .╪=SIDE, .┘=SEC
  409.    JSR DIVIDE┬Y├YL╙ECS
  410.    LDX #0
  411.    CPY SECTORS╨ER╘RACK
  412.    BCC +
  413.    PHA
  414.    TYA
  415.    SBC SECTORS╨ER╘RACK
  416.    TAY
  417.    PLA
  418.    LDX #1
  419. +  INY
  420.    RTS
  421.  
  422. DEST╨TR = 6
  423. CUR├YLINDER = 8
  424. CUR╙IDE = 9
  425. CUR╙ECTOR = 10
  426. BLOCK├OUNTDOWN = 11
  427. SOURCE╨TR = 12
  428.  
  429. COPY┬LOCKS = *  ;( .┴┘=START┬LOCK, .╪=BLOCK├OUNT, ($6)=DEST ) : .├╙=ERR
  430.    STX BLOCK├OUNTDOWN
  431.    JSR CONVERT╠OGICAL┬LOCK╬UM
  432.    STA CUR├YLINDER
  433.    STX CUR╙IDE
  434.    STY CUR╙ECTOR
  435.  
  436.    COPY┬LOCK╠OOP = *
  437.    LDA CUR├YLINDER
  438.    LDX CUR╙IDE
  439.    LDY CUR╙ECTOR
  440.    JSR READ┬LOCK
  441.    BCC +
  442.    RTS
  443. +  STA SOURCE╨TR+0
  444.    STY SOURCE╨TR+1
  445.    LDX #2
  446.    LDY #0
  447. -  LDA (SOURCE╨TR),Y
  448.    STA (DEST╨TR),Y
  449.    INY
  450.    LDA (SOURCE╨TR),Y
  451.    STA (DEST╨TR),Y
  452.    INY
  453.    BNE -
  454.    INC SOURCE╨TR+1
  455.    INC DEST╨TR+1
  456.    DEX
  457.    BNE -
  458.    INC CUR╙ECTOR
  459.    LDA CUR╙ECTOR
  460.    CMP SECTORS╨ER╘RACK
  461.    BEQ +
  462.    BCC +
  463.    LDA #1
  464.    STA CUR╙ECTOR
  465.    INC CUR╙IDE
  466.    LDA CUR╙IDE
  467.    CMP #2
  468.    BCC +
  469.    LDA #0
  470.    STA CUR╙IDE
  471.    INC CUR├YLINDER
  472. +  DEC BLOCK├OUNTDOWN
  473.    BNE COPY┬LOCK╠OOP
  474.    CLC
  475.    RTS
  476.  
  477. CONVERT├LUSTER╬UM = *  ;( .┴┘=CLUSTER╬UM ) : .┴┘=LOGICAL┬LOCK╬UM
  478.    SEC
  479.    SBC #2
  480.    BCS +
  481.    DEY
  482. +  LDX CLUSTER┬LOCK├OUNT
  483.    CPX #1
  484.    BEQ +
  485.    ASL
  486.    STY 7
  487.    ROL 7
  488.    LDY 7
  489. +  CLC
  490.    ADC FIRST╞ILE┬LOCK
  491.    BCC +
  492.    INY
  493. +  RTS
  494.  
  495. READ├LUSTER = *  ;( .┴┘=CLUSTER╬UMBER ) : CLUSTER┬UF, .├╙=ERR
  496.    JSR CONVERT├LUSTER╬UM
  497.  
  498.    ;** READ LOGICAL BLOCKS COMPRISING CLUSTER
  499.    LDX #<CLUSTER┬UF
  500.    STX 6
  501.    LDX #>CLUSTER┬UF
  502.    STX 7
  503.    LDX CLUSTER┬LOCK├OUNT
  504.    JMP COPY┬LOCKS
  505.  
  506. WRITE╠OGICAL┬LOCK = *  ;( .┴┘=LOGICAL┬LOCK╬UMBER, BUFPTR ) : .├╙=ERR
  507.    JSR CONVERT╠OGICAL┬LOCK╬UM
  508.    CMP BUF├YLINDER
  509.    BNE +
  510.    CPX BUF╙IDE
  511.    BNE +
  512.    PHA
  513.    LDA #$FF
  514.    STA BUF├YLINDER
  515.    STA BUF╙IDE
  516.    PLA
  517. +  JSR WRITE╙ECTOR
  518.    RTS
  519.  
  520. WRITE├LUSTER╙AVE .BUF 2
  521.  
  522. WRITE├LUSTER = *  ;( .┴┘=CLUSTER╬UMBER, CLUSTER┬UF ) : .├╙=ERR
  523.    JSR CONVERT├LUSTER╬UM
  524.    LDX #<CLUSTER┬UF
  525.    STX BUFPTR+0
  526.    LDX #>CLUSTER┬UF
  527.    STX BUFPTR+1
  528.    STA WRITE├LUSTER╙AVE+0
  529.    STY WRITE├LUSTER╙AVE+1
  530.    JSR WRITE╠OGICAL┬LOCK
  531.    BCC +
  532.    RTS
  533. +  LDA CLUSTER┬LOCK├OUNT
  534.    CMP #2
  535.    BCS +
  536.    RTS
  537. +  LDA WRITE├LUSTER╙AVE+0
  538.    LDY WRITE├LUSTER╙AVE+1
  539.    CLC
  540.    ADC #1
  541.    BCC +
  542.    INY
  543. +  JSR WRITE╠OGICAL┬LOCK
  544.    RTS
  545.  
  546. ;====═╙-─╧╙ FORMAT LEVEL====
  547.  
  548. BOOT┬LOCK = 2
  549.  
  550. MS─IR = *  ;( ) : .┴┘=DIRBUF, .╪=DIR┼NTRIES, .├╙=ERR
  551.    LDA #$0E
  552.    STA $FF00
  553.  
  554.    ;** GET PARAMETERS FROM BOOT SECTOR
  555.    LDA #0
  556.    LDY #0
  557.    JSR CONVERT╠OGICAL┬LOCK╬UM
  558.    JSR READ┬LOCK
  559.    BCC +
  560.    RTS
  561. +  STA BOOT┬LOCK+0
  562.    STY BOOT┬LOCK+1
  563.    LDY #13              ;GET CLUSTER SIZE
  564.    LDA (BOOT┬LOCK),Y
  565.    STA CLUSTER┬LOCK├OUNT
  566.    CMP #3
  567.    BCC +
  568.  
  569.    INVALID╨ARMS = *
  570.    LDA #$FF
  571.    STA ERRNO
  572.    SEC
  573.    RTS
  574.  
  575. +  LDY #16              ;CHECK ╞┴╘ REPLICATION COUNT, MUST BE 2
  576.    LDA (BOOT┬LOCK),Y
  577.    CMP #2
  578.    BNE INVALID╨ARMS
  579.    LDY #22              ;GET ╞┴╘ SIZE IN SECTORS, MAX OF 9
  580.    LDA (BOOT┬LOCK),Y
  581.    STA FAT┬LOCKS
  582.    CMP #10
  583.    BCS INVALID╨ARMS
  584.    LDY #17              ;GET DIRECTORY SIZE
  585.    LDA (BOOT┬LOCK),Y
  586.    STA ROOT─IR┼NTRIES
  587.    CMP #225
  588.    BCS INVALID╨ARMS
  589.    LSR
  590.    LSR
  591.    LSR
  592.    LSR
  593.    STA ROOT─IR┬LOCKS
  594.    LDY #19              ;GET TOTAL SECTOR COUNT
  595.    LDA (BOOT┬LOCK),Y
  596.    STA TOTAL╙ECTORS+0
  597.    INY
  598.    LDA (BOOT┬LOCK),Y
  599.    STA TOTAL╙ECTORS+1
  600.    LDY #24              ;CHECK SECTORS PER TRACK, MUST BE 18 OR FEWER
  601.    LDA (BOOT┬LOCK),Y
  602.    CMP #19
  603.    BCS INVALID╨ARMS
  604.    LDY #26
  605.    LDA (BOOT┬LOCK),Y
  606.    CMP #2               ;CHECK NUMBER OF SIDES, MUST BE 2
  607.    BNE INVALID╨ARMS
  608.    LDY #14              ;CHECK NUMBER OF BOOT SECTORS, MUST BE 1
  609.    LDA (BOOT┬LOCK),Y
  610.    CMP #1
  611.    BNE INVALID╨ARMS
  612.  
  613.    ;** GET DERIVED PARAMETERS
  614.    LDA FAT┬LOCKS        ;FIRST ROOT DIRECTORY SECTOR
  615.    ASL
  616.    CLC
  617.    ADC #1
  618.    STA FIRST╥OOT─IR┬LOCK
  619.    CLC                  ;FIRST FILE SECTOR
  620.    ADC ROOT─IR┬LOCKS
  621.    STA FIRST╞ILE┬LOCK
  622.    LDA TOTAL╙ECTORS+0   ;NUMBER OF FILE CLUSTERS
  623.    LDY TOTAL╙ECTORS+1
  624.    SEC
  625.    SBC FIRST╞ILE┬LOCK
  626.    BCS +
  627.    DEY
  628. +  STA FILE├LUSTER├OUNT+0
  629.    STY FILE├LUSTER├OUNT+1
  630.    LDA CLUSTER┬LOCK├OUNT
  631.    CMP #2
  632.    BNE +
  633.    LSR FILE├LUSTER├OUNT+1
  634.    ROR FILE├LUSTER├OUNT+0
  635. +  CLC
  636.    LDA FILE├LUSTER├OUNT+0
  637.    ADC #2
  638.    STA LAST╞AT┼NTRY+0
  639.    LDA FILE├LUSTER├OUNT+1
  640.    ADC #0
  641.    STA LAST╞AT┼NTRY+1
  642.  
  643.    ;** LOAD ╞┴╘
  644.    LDA #<FATBUF
  645.    LDY #>FATBUF
  646.    STA 6
  647.    STY 7
  648.    LDA #1
  649.    LDY #0
  650.    LDX FAT┬LOCKS
  651.    JSR COPY┬LOCKS
  652.    BCC +
  653.    RTS
  654.  
  655.    ;** LOAD ACTUAL DIRECTORY
  656. +  LDA #<DIRBUF
  657.    LDY #>DIRBUF
  658.    STA 6
  659.    STY 7
  660.    LDA FIRST╥OOT─IR┬LOCK
  661.    LDY #0
  662.    LDX ROOT─IR┬LOCKS
  663.    JSR COPY┬LOCKS
  664.    BCC +
  665.    RTS
  666. +  LDA #<DIRBUF
  667.    LDY #>DIRBUF
  668.    LDX ROOT─IR┼NTRIES
  669.    CLC
  670.    RTS
  671.  
  672. ENTRY┴DDR = 2
  673. ENTRY╫ORK = 4
  674. ENTRY┬ITS = 5
  675. ENTRY─ATA0 = 6
  676. ENTRY─ATA1 = 7
  677. ENTRY─ATA2 = 8
  678.  
  679. LOCATE╞AT┼NTRY = *  ;( .┴┘=FAT┼NTRY╬UMBER ) : ENTRY┴DDR, ENTRY┬ITS1
  680.    STA ENTRY┬ITS
  681.    ;** DIVIDE BY TWO
  682.    STY ENTRY┴DDR+1
  683.    LSR ENTRY┴DDR+1
  684.    ROR
  685.  
  686.    ;** TIMES THREE
  687.    STA ENTRY╫ORK
  688.    LDX ENTRY┴DDR+1
  689.    ASL
  690.    ROL ENTRY┴DDR+1
  691.    CLC
  692.    ADC ENTRY╫ORK
  693.    STA ENTRY┴DDR
  694.    TXA
  695.    ADC ENTRY┴DDR+1
  696.    STA ENTRY┴DDR+1
  697.  
  698.    ;** ADD BASE, GET DATA
  699.    CLC
  700.    LDA ENTRY┴DDR
  701.    ADC #<FATBUF
  702.    STA ENTRY┴DDR
  703.    LDA ENTRY┴DDR+1
  704.    ADC #>FATBUF
  705.    STA ENTRY┴DDR+1
  706.    LDY #2
  707. -  LDA (ENTRY┴DDR),Y
  708.    STA ENTRY─ATA0,Y
  709.    DEY
  710.    BPL -
  711.    RTS
  712.  
  713. GET╞AT┼NTRY = *  ;( .┴┘=FAT┼NTRY╬UMBER ) : .┴┘=FAT┼NTRY╓ALUE
  714.    JSR LOCATE╞AT┼NTRY
  715.    LDA ENTRY┬ITS
  716.    AND #1
  717.    BNE +
  718.  
  719.    ;** CASE 1: FIRST 12-BIT CLUSTER
  720.    LDA ENTRY─ATA1
  721.    AND #$0F
  722.    TAY
  723.    LDA ENTRY─ATA0
  724.    RTS
  725.  
  726.    ;** CASE 2: SECOND 12-BIT CLUSTER
  727. +  LDA ENTRY─ATA1
  728.    LDX #4
  729. -  LSR ENTRY─ATA2
  730.    ROR
  731.    DEX
  732.    BNE -
  733.    LDY ENTRY─ATA2
  734.    RTS
  735.  
  736. FAT╓ALUE = 9
  737.  
  738. SET╞AT┼NTRY = *  ;( .┴┘=FAT┼NTRY╬UMBER, (FAT╓ALUE) )
  739.    JSR LOCATE╞AT┼NTRY
  740.    LDA FAT╓ALUE+1
  741.    AND #$0F
  742.    STA FAT╓ALUE+1
  743.    LDA ENTRY┬ITS
  744.    AND #1
  745.    BNE +
  746.  
  747.    ;** CASE 1: FIRST 12-BIT CLUSTER
  748.    LDA FAT╓ALUE
  749.    STA ENTRY─ATA0
  750.    LDA ENTRY─ATA1
  751.    AND #$F0
  752.    ORA FAT╓ALUE+1
  753.    STA ENTRY─ATA1
  754.    JMP SET╞AT┼XIT
  755.  
  756.    ;** CASE 2: SECOND 12-BIT CLUSTER
  757. +  LDX #4
  758. -  ASL FAT╓ALUE
  759.    ROL FAT╓ALUE+1
  760.    DEX
  761.    BNE -
  762.    LDA FAT╓ALUE+1
  763.    STA ENTRY─ATA2
  764.    LDA ENTRY─ATA1
  765.    AND #$0F
  766.    ORA FAT╓ALUE
  767.    STA ENTRY─ATA1
  768.  
  769.    SET╞AT┼XIT = *
  770.    LDY #2
  771. -  LDA ENTRY─ATA0,Y
  772.    STA (ENTRY┴DDR),Y
  773.    DEY
  774.    BPL -
  775.    STY FAT─IRTY
  776.    RTS
  777.  
  778. DIRTY─IRENT = *  ;( WRITE─IRENT )
  779.    SEC
  780.    LDA WRITE─IRENT+0
  781.    SBC #<DIRBUF
  782.    LDA WRITE─IRENT+1
  783.    SBC #>DIRBUF
  784.    LSR
  785.    AND #$0F
  786.    TAX
  787.    LDA #$FF
  788.    STA DIR─IRTY,X
  789.    RTS
  790.  
  791. DEL├LUSTER = 14
  792.  
  793. MS─ELETE = *  ;( WRITE─IRENT )
  794.    LDY #$0E
  795.    STY $FF00
  796.    LDA WRITE─IRENT+0
  797.    LDY WRITE─IRENT+1
  798.    STA 2
  799.    STY 3
  800.    LDA #$E5
  801.    LDY #0
  802.    STA (2),Y
  803.    LDY #26
  804.    LDA (2),Y
  805.    STA DEL├LUSTER+0
  806.    INY
  807.    LDA (2),Y
  808.    STA DEL├LUSTER+1
  809. -  LDA DEL├LUSTER+1
  810.    CMP #12  ;CLUSTER NUMBER HIGH BYTE
  811.    BCC +
  812.    JMP DIRTY─IRENT
  813. +  TAY
  814.    LDA DEL├LUSTER
  815.    JSR GET╞AT┼NTRY
  816.    PHA
  817.    TYA
  818.    PHA
  819.    LDA #0
  820.    STA FAT╓ALUE+0
  821.    STA FAT╓ALUE+1
  822.    LDA DEL├LUSTER+0
  823.    LDY DEL├LUSTER+1
  824.    JSR SET╞AT┼NTRY
  825.    PLA
  826.    STA DEL├LUSTER+1
  827.    PLA
  828.    STA DEL├LUSTER
  829.    JMP -
  830.  
  831. FLUSH┬LOCK = 14
  832. FLUSH├OUNTDOWN = $60
  833. FLUSH╥EPEATS = $61
  834. FLUSH─IR╔NDEX = $61
  835.  
  836. MS╞LUSH = *  ;( MS─EVICE, MS╘YPE ) : .├╙=ERROR
  837.    LDA #$0E
  838.    STA $FF00
  839.    LDA FAT─IRTY
  840.    BEQ FLUSH─IRECTORY
  841.    LDA #0
  842.    STA FAT─IRTY
  843.  
  844.    ;** FLUSH FAT
  845.    LDA #2
  846.    STA FLUSH╥EPEATS
  847.    LDA #1
  848.    STA FLUSH┬LOCK
  849.  
  850.    MASTER╞LUSH = *
  851.    LDA FAT┬LOCKS
  852.    STA FLUSH├OUNTDOWN
  853.    LDA #<FATBUF
  854.    LDY #>FATBUF
  855.    STA BUFPTR
  856.    STY BUFPTR+1
  857. -  LDA FLUSH┬LOCK
  858.    LDY #0
  859.    JSR WRITE╠OGICAL┬LOCK
  860.    BCC +
  861.    RTS
  862. +  INC FLUSH┬LOCK
  863.    DEC FLUSH├OUNTDOWN
  864.    BNE -
  865.    DEC FLUSH╥EPEATS
  866.    BNE MASTER╞LUSH
  867.  
  868.    ;** FLUSH DIRECTORY
  869.    FLUSH─IRECTORY = *
  870.    LDA FIRST╥OOT─IR┬LOCK
  871.    STA FLUSH┬LOCK
  872.    LDA ROOT─IR┬LOCKS
  873.    STA FLUSH├OUNTDOWN
  874.    LDA #0
  875.    STA FLUSH─IR╔NDEX
  876.    LDA #<DIRBUF
  877.    LDY #>DIRBUF
  878.    STA BUFPTR+0
  879.    STY BUFPTR+1
  880. -  LDX FLUSH─IR╔NDEX
  881.    LDA DIR─IRTY,X
  882.    BEQ +
  883.    LDA #0
  884.    STA DIR─IRTY,X
  885.    LDA FLUSH┬LOCK
  886.    LDY #0
  887.    JSR WRITE╠OGICAL┬LOCK
  888.    DEC BUFPTR+1
  889.    DEC BUFPTR+1
  890. +  INC FLUSH┬LOCK
  891.    INC FLUSH─IR╔NDEX
  892.    INC BUFPTR+1
  893.    INC BUFPTR+1
  894.    DEC FLUSH├OUNTDOWN
  895.    BNE -
  896.    CLC
  897.    RTS
  898.  
  899. BF╞AT┼NTRY = 14
  900. BF┬LOCKS = $60
  901.  
  902. MS┬YTES╞REE = *  ;( ) : .┴┘╪=FILE┬YTES╞REE
  903.    LDY #$0E
  904.    STY $FF00
  905.    LDA #2
  906.    LDY #0
  907.    STA BF╞AT┼NTRY+0
  908.    STY BF╞AT┼NTRY+1
  909.    STY BF┬LOCKS+0
  910.    STY BF┬LOCKS+1
  911. -  LDA BF╞AT┼NTRY+0
  912.    LDY BF╞AT┼NTRY+1
  913.    JSR GET╞AT┼NTRY
  914.    STY 2
  915.    ORA 2
  916.    BNE +
  917.    INC BF┬LOCKS+0
  918.    BNE +
  919.    INC BF┬LOCKS+1
  920. +  INC BF╞AT┼NTRY
  921.    BNE +
  922.    INC BF╞AT┼NTRY+1
  923. +  LDA BF╞AT┼NTRY+0
  924.    CMP LAST╞AT┼NTRY+0
  925.    LDA BF╞AT┼NTRY+1
  926.    SBC LAST╞AT┼NTRY+1
  927.    BCC -
  928.    LDX CLUSTER┬LOCK├OUNT
  929. -  ASL BF┬LOCKS
  930.    ROL BF┬LOCKS+1
  931.    DEX
  932.    BNE -
  933.    LDA #0
  934.    LDY BF┬LOCKS+0
  935.    LDX BF┬LOCKS+1
  936.    RTS
  937.  
  938. ;====FILE COPY LEVEL====
  939.  
  940. TRANS═ODE = 14
  941. LFN = 15
  942. CBM─ATA╨TR = $60
  943. CBM─ATA╠EN = $62
  944. CLUSTER = $64
  945.  
  946. COPY╞ILE├LUSTER = *  ;( CLUSTER, LFN, TRANS═ODE ) : .├╙=ERR
  947.    LDA CLUSTER+0
  948.    LDY CLUSTER+1
  949.    JSR READ├LUSTER
  950.    BCC +
  951.    RTS
  952. +  LDA #<CLUSTER┬UF
  953.    LDY #>CLUSTER┬UF
  954.    STA CBM─ATA╨TR+0
  955.    STY CBM─ATA╨TR+1
  956.    LDA #0
  957.    STA CBM─ATA╠EN+0
  958.    LDA CLUSTER┬LOCK├OUNT
  959.    ASL
  960.    STA CBM─ATA╠EN+1
  961.  
  962.    ;**GET NEXT CLUSTER
  963.    LDA CLUSTER+0
  964.    LDY CLUSTER+1
  965.    JSR GET╞AT┼NTRY
  966.    STA CLUSTER+0
  967.    STY CLUSTER+1
  968.    CPY #12  ;CLUSTER NUMBER HIGH BYTE
  969.    BCC COPY╞ILE├LUSTER─ATA
  970.    LDA LEN═╠
  971.    STA CBM─ATA╠EN
  972.    LDA #$01
  973.    LDX CLUSTER┬LOCK├OUNT
  974.    CPX #1
  975.    BEQ +
  976.    LDA #$03
  977. +  AND LEN═╠+1
  978.    BNE +
  979.    LDX LEN═╠
  980.    BEQ COPY╞ILE├LUSTER─ATA
  981. +  STA CBM─ATA╠EN+1
  982.  
  983.    COPY╞ILE├LUSTER─ATA = *
  984.    JSR COMMIE╧UT
  985.    RTS
  986.  
  987. CBM─ATA╠IMIT = $66
  988.  
  989. COMMIE╧UT = *  ;( CBM─ATA╨TR, CBM─ATA╠EN ) : .├╙=ERR
  990.    LDX LFN
  991.    BNE +
  992.    CLC
  993.    RTS
  994. +  JSR KERNEL├HKOUT
  995.    BCC COMMIE╧UT═ORE
  996.    STA ERRNO
  997.    RTS
  998.  
  999.    COMMIE╧UT═ORE = *
  1000.    LDA #255
  1001.    LDX CBM─ATA╠EN+1
  1002.    BNE +
  1003.    LDA CBM─ATA╠EN
  1004. +  STA CBM─ATA╠IMIT
  1005.    LDY #0
  1006. -  LDA (CBM─ATA╨TR),Y
  1007.    BIT TRANS═ODE
  1008.    BPL +
  1009.    TAX
  1010.    LDA TRANS┬UF,X
  1011.    BEQ COMMIE╬EXT
  1012. +  JSR KERNEL├HROUT
  1013.    COMMIE╬EXT = *
  1014.    INY
  1015.    CPY CBM─ATA╠IMIT
  1016.    BNE -
  1017.  
  1018.    CLC
  1019.    LDA CBM─ATA╨TR
  1020.    ADC CBM─ATA╠IMIT
  1021.    STA CBM─ATA╨TR
  1022.    BCC +
  1023.    INC CBM─ATA╨TR+1
  1024. +  SEC
  1025.    LDA CBM─ATA╠EN
  1026.    SBC CBM─ATA╠IMIT
  1027.    STA CBM─ATA╠EN
  1028.    BCS +
  1029.    DEC CBM─ATA╠EN+1
  1030. +  LDA CBM─ATA╠EN
  1031.    ORA CBM─ATA╠EN+1
  1032.    BNE COMMIE╧UT═ORE
  1033.    JSR KERNEL├LRCHN
  1034.    CLC
  1035.    RTS
  1036.  
  1037. MS╥EAD = *  ;( CLUSTER, LEN═╠, .┴=TRANS═ODE, .╪=LFN ) : .├╙=ERR
  1038.    LDY #$0E
  1039.    STY $FF00
  1040.    STA TRANS═ODE
  1041.    STX LFN
  1042.    LDA START├LUSTER+0
  1043.    LDY START├LUSTER+1
  1044.    STA CLUSTER+0
  1045.    STY CLUSTER+1
  1046.    JMP +
  1047. -  JSR COPY╞ILE├LUSTER
  1048.    BCC +
  1049.    RTS
  1050. +  LDA CLUSTER+1
  1051.    CMP #12  ;CLUSTER NUMBER HIGH BYTE
  1052.    BCC -
  1053.    CLC
  1054.    RTS
  1055.  
  1056. IN╠FN = $50
  1057. GENERATE╠F = $51
  1058. CBM─ATA═AX = $52
  1059. REACHED┼OF = $54
  1060. PREV╙T = $55
  1061.  
  1062. COMMIE╔N╔NIT = *  ;( .┴=TRANS═ODE, .╪=IN╠FN )
  1063.    STA TRANS═ODE
  1064.    STX IN╠FN
  1065.    LDA #0
  1066.    STA GENERATE╠F
  1067.    STA REACHED┼OF
  1068.    STA PREV╙T
  1069.    RTS
  1070.  
  1071. COMMIE╔N = *  ;( CBM─ATA╨TR++, CBM─ATA═AX ) : CBM─ATA╠EN, .├╙=ERR, .┌=EOF
  1072.    LDA #0
  1073.    STA CBM─ATA╠EN
  1074.    STA CBM─ATA╠EN+1
  1075.    LDX REACHED┼OF
  1076.    BEQ +
  1077.    LDA #0
  1078.    CLC
  1079.    RTS
  1080. +  LDX IN╠FN
  1081.    JSR KERNEL├HKIN
  1082.    BCC COMMIE╔N═ORE
  1083.    STA ERRNO
  1084.    RTS
  1085.  
  1086.    COMMIE╔N═ORE = *
  1087.    LDA #255
  1088.    LDX CBM─ATA═AX+1
  1089.    BNE +
  1090.    LDA CBM─ATA═AX
  1091. +  STA CBM─ATA╠IMIT
  1092.    LDY #0
  1093. -  JSR COMMIE╔N┬YTE
  1094.    BCC +
  1095.    RTS
  1096. +  BEQ +
  1097.    STA (CBM─ATA╨TR),Y
  1098.    INY
  1099.    CPY CBM─ATA╠IMIT
  1100.    BNE -
  1101.  
  1102. +  STY CBM─ATA╠IMIT
  1103.    CLC
  1104.    LDA CBM─ATA╨TR
  1105.    ADC CBM─ATA╠IMIT
  1106.    STA CBM─ATA╨TR
  1107.    BCC +
  1108.    INC CBM─ATA╨TR+1
  1109. +  CLC
  1110.    LDA CBM─ATA╠EN
  1111.    ADC CBM─ATA╠IMIT
  1112.    STA CBM─ATA╠EN
  1113.    BCC +
  1114.    INC CBM─ATA╠EN+1
  1115. +  SEC
  1116.    LDA CBM─ATA═AX
  1117.    SBC CBM─ATA╠IMIT
  1118.    STA CBM─ATA═AX
  1119.    BCS +
  1120.    DEC CBM─ATA═AX+1
  1121. +  LDA REACHED┼OF
  1122.    BNE +
  1123.    LDA CBM─ATA═AX
  1124.    ORA CBM─ATA═AX+1
  1125.    BNE COMMIE╔N═ORE
  1126. +  JSR KERNEL├LRCHN
  1127.    LDA CBM─ATA╠EN
  1128.    ORA CBM─ATA╠EN+1
  1129.    CLC
  1130.    RTS
  1131.  
  1132. COMMIE╔N┬YTE = *  ;( ) : .┴=CHAR, .├╙=ERR, .┌=EOF, REACHED┼OF
  1133.    ;** CHECK FOR ALREADY PAST EOF
  1134.    LDA REACHED┼OF
  1135.    BEQ +
  1136.    BRK
  1137.    ;** CHECK FOR GENERATED LINEFEED
  1138. +  LDA GENERATE╠F
  1139.    BEQ +
  1140.    LDA #0
  1141.    STA GENERATE╠F
  1142.    LDA #$0A
  1143.    CLC
  1144.    RTS
  1145.    ;** CHECK FOR EOF
  1146. +  LDA PREV╙T
  1147.    AND #$40
  1148.    BEQ +
  1149.    LDA #$FF
  1150.    STA REACHED┼OF
  1151.    LDA #0
  1152.    CLC
  1153.    RTS
  1154.    ;** READ ACTUAL CHARACTER
  1155. +  JSR KERNEL├HRIN
  1156.    LDX ST
  1157.    STX PREV╙T
  1158.    BCC +
  1159.    STA ERRNO
  1160.    JSR KERNEL├LRCHN
  1161.    RTS
  1162.    ;** TRANSLATE IF NECESSARY
  1163. +  BIT TRANS═ODE
  1164.    BPL +
  1165.    TAX
  1166.    LDA TRANS┬UF╘O┴SCII,X
  1167.    BEQ COMMIE╔N┬YTE
  1168.    CMP #$0D
  1169.    BNE +
  1170.    STA GENERATE╠F
  1171.    ;** EXIT
  1172. +  LDX #$FF
  1173.    CLC
  1174.    RTS
  1175.  
  1176. FIRST╞REE╞AT┼NTRY = $5A
  1177.  
  1178. ALLOCATE╞AT┼NTRY = *  ;( ) : .┴┘=FAT┼NTRY, .├╙=ERR
  1179. -  LDA FIRST╞REE╞AT┼NTRY
  1180.    CMP LAST╞AT┼NTRY
  1181.    LDA FIRST╞REE╞AT┼NTRY+1
  1182.    SBC LAST╞AT┼NTRY+1
  1183.    BCC +
  1184.    RTS
  1185. +  LDA FIRST╞REE╞AT┼NTRY
  1186.    LDY FIRST╞REE╞AT┼NTRY+1
  1187.    JSR GET╞AT┼NTRY
  1188.    STY 2
  1189.    ORA 2
  1190.    BNE +
  1191.    LDA FIRST╞REE╞AT┼NTRY
  1192.    LDY FIRST╞REE╞AT┼NTRY+1
  1193.    CLC
  1194.    RTS
  1195. +  INC FIRST╞REE╞AT┼NTRY
  1196.    BNE -
  1197.    INC FIRST╞REE╞AT┼NTRY+1
  1198.    JMP -
  1199.  
  1200. MS╞ILE╠ENGTH = $5C  ;(3 BYTES)
  1201.  
  1202. MS╫RITE├LUSTER = *  ; (*) : .├╙=ERR
  1203.    ;** GET A NEW CLUSTER
  1204.    JSR ALLOCATE╞AT┼NTRY
  1205.    BCC +
  1206.    RTS
  1207.    ;** MAKE PREVIOUS FAT ENTRY POINT TO NEW CLUSTER
  1208. +  STA FAT╓ALUE
  1209.    STY FAT╓ALUE+1
  1210.    LDA CLUSTER
  1211.    ORA CLUSTER+1
  1212.    BEQ +
  1213.    LDA CLUSTER
  1214.    LDY CLUSTER+1
  1215.    LDX FAT╓ALUE
  1216.    STX CLUSTER
  1217.    LDX FAT╓ALUE+1
  1218.    STX CLUSTER+1
  1219.    JSR SET╞AT┼NTRY
  1220.    JMP MS├LUSTER╬EW
  1221. +  LDA WRITE─IRENT
  1222.    LDY WRITE─IRENT+1
  1223.    STA 2
  1224.    STY 3
  1225.    LDY #26
  1226.    LDA FAT╓ALUE
  1227.    STA (2),Y
  1228.    STA CLUSTER
  1229.    INY
  1230.    LDA FAT╓ALUE+1
  1231.    STA (2),Y
  1232.    STA CLUSTER+1
  1233.  
  1234.    ;** MAKE NEW FAT ENTRY POINT TO NULL
  1235.    MS├LUSTER╬EW = *
  1236.    LDA #$FF
  1237.    LDY #$0F
  1238.    STA FAT╓ALUE
  1239.    STY FAT╓ALUE+1
  1240.    LDA CLUSTER
  1241.    LDY CLUSTER+1
  1242.    JSR SET╞AT┼NTRY
  1243.    ;** WRITE NEW CLUSTER DATA
  1244. +  LDA CLUSTER
  1245.    LDY CLUSTER+1
  1246.    JSR WRITE├LUSTER
  1247.    BCC +
  1248.    RTS
  1249.    ;** ADD CLUSTER LENGTH TO FILE LENGTH
  1250. +  CLC
  1251.    LDA MS╞ILE╠ENGTH
  1252.    ADC CBM─ATA╠EN
  1253.    STA MS╞ILE╠ENGTH
  1254.    LDA MS╞ILE╠ENGTH+1
  1255.    ADC CBM─ATA╠EN+1
  1256.    STA MS╞ILE╠ENGTH+1
  1257.    BCC +
  1258.    INC MS╞ILE╠ENGTH+2
  1259. +  CLC
  1260.    RTS
  1261.  
  1262. MS╫RITE = *  ;( MS─EVICE, MS╘YPE, WRITE─IRENT, .┴=TRANS, .╪=CBM╠FN ) :.├╙=ERR
  1263.    LDY #$0E
  1264.    STY $FF00
  1265.    ;** INITIALIZE
  1266.    JSR COMMIE╔N╔NIT
  1267.    LDA #0
  1268.    STA CLUSTER
  1269.    STA CLUSTER+1
  1270.    STA FIRST╞REE╞AT┼NTRY+1
  1271.    STA MS╞ILE╠ENGTH
  1272.    STA MS╞ILE╠ENGTH+1
  1273.    STA MS╞ILE╠ENGTH+2
  1274.    LDA #2
  1275.    STA FIRST╞REE╞AT┼NTRY
  1276.  
  1277.    ;** COPY CLUSTER FROM CBM FILE
  1278. -  LDA #<CLUSTER┬UF
  1279.    LDY #>CLUSTER┬UF
  1280.    STA CBM─ATA╨TR
  1281.    STY CBM─ATA╨TR+1
  1282.    LDA CLUSTER┬LOCK├OUNT
  1283.    ASL
  1284.    TAY
  1285.    LDA #0
  1286.    STA CBM─ATA═AX
  1287.    STY CBM─ATA═AX+1
  1288.    JSR COMMIE╔N
  1289.    BCC +
  1290.    RTS
  1291. +  BEQ +
  1292.    JSR MS╫RITE├LUSTER
  1293.    BCC -
  1294.    RTS
  1295.  
  1296.    ;** WRAP UP AFTER WRITING - SET FILE LENGTH, DIRTY FLAG, EXIT.
  1297. +  LDA WRITE─IRENT
  1298.    LDY WRITE─IRENT+1
  1299.    STA 2
  1300.    STY 3
  1301.    LDX #0
  1302.    LDY #28
  1303. -  LDA MS╞ILE╠ENGTH,X
  1304.    STA (2),Y
  1305.    INY
  1306.    INX
  1307.    CPX #3
  1308.    BCC -
  1309.    JSR DIRTY─IRENT
  1310.    CLC
  1311.    RTS
  1312.  
  1313. ;===== COMMODORE FILE LEVEL =====
  1314.  
  1315. CBM├OPY = *  ;( .┴=IN╠FN, .╪=OUT╠FN )
  1316.    LDY #$0E
  1317.    STY $FF00
  1318.    STX LFN
  1319.    TAX
  1320.    LDA #0
  1321.    JSR COMMIE╔N╔NIT
  1322. -  LDA #<CLUSTER┬UF
  1323.    LDY #>CLUSTER┬UF
  1324.    STA CBM─ATA╨TR
  1325.    STY CBM─ATA╨TR+1
  1326.    LDA #<1024
  1327.    LDY #>1024
  1328.    STA CBM─ATA═AX
  1329.    STY CBM─ATA═AX+1
  1330.    JSR COMMIE╔N
  1331.    BCS +
  1332.    BEQ +
  1333.    LDA #<CLUSTER┬UF
  1334.    LDY #>CLUSTER┬UF
  1335.    STA CBM─ATA╨TR
  1336.    STY CBM─ATA╨TR+1
  1337.    JSR COMMIE╧UT
  1338.    BCS +
  1339.    JMP -
  1340. +  RTS
  1341.  
  1342. CBM─IRENT = *  ;( .┴=LFN )
  1343.    LDY #$0E
  1344.    STY $FF00
  1345.    TAX
  1346.    JSR KERNEL├HKIN
  1347.    BCC +
  1348.    CDIR┼RR = *
  1349.    LDA #0
  1350.    STA CDIR╞LEN
  1351.    STA CDIR┬LOCKS
  1352.    STA CDIR┬LOCKS+1
  1353.    RTS
  1354.    ;** GET BLOCK COUNT
  1355. +  JSR CDIR╟ETCH
  1356.    JSR CDIR╟ETCH
  1357.    JSR CDIR╟ETCH
  1358.    STA CDIR┬LOCKS
  1359.    JSR CDIR╟ETCH
  1360.    STA CDIR┬LOCKS+1
  1361.    ;** LOOK FOR FILENAME
  1362.    LDA #0
  1363.    STA CDIR╞LEN
  1364. -  JSR CDIR╟ETCH
  1365.    CMP #34
  1366.    BEQ +
  1367.    CMP #"B"
  1368.    BNE -
  1369.    JSR KERNEL├LRCHN
  1370.    RTS
  1371.    ;** GET FILENAME
  1372. +  LDY #0
  1373. -  JSR CDIR╟ETCH
  1374.    CMP #34
  1375.    BEQ +
  1376.    STA CDIR╬AME,Y
  1377.    INY
  1378.    BNE -
  1379. +  STY CDIR╞LEN
  1380. -  JSR CDIR╟ETCH
  1381.    CMP #" "
  1382.    BEQ -
  1383.    STA CDIR╘YPE
  1384. -  JSR CDIR╟ETCH
  1385.    CMP #0
  1386.    BNE -
  1387.    JSR KERNEL├LRCHN
  1388.    RTS
  1389.  
  1390. CDIR╟ETCH = *
  1391.    JSR KERNEL├HRIN
  1392.    BCS +
  1393.    BIT ST
  1394.    BVS +
  1395.    RTS
  1396. +  PLA
  1397.    PLA
  1398.    JSR KERNEL├LRCHN
  1399.    JMP CDIR┼RR
  1400.  
  1401. ;===== DATA =====
  1402.  
  1403. TRANS┬UF = *
  1404.        ;0   1   2   3   4   5   6   7   8   9   A   B   C   D   E   F
  1405. .BYTE $00,$00,$00,$00,$00,$00,$00,$00,$14,$09,$0D,$00,$93,$00,$00,$00 ;0
  1406. .BYTE $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00 ;1
  1407. .BYTE $20,$21,$22,$23,$24,$25,$26,$27,$28,$29,$2A,$2B,$2C,$2D,$2E,$2F ;2
  1408. .BYTE $30,$31,$32,$33,$34,$35,$36,$37,$38,$39,$3A,$3B,$3C,$3D,$3E,$3F ;3
  1409. .BYTE $40,$C1,$C2,$C3,$C4,$C5,$C6,$C7,$C8,$C9,$CA,$CB,$CC,$CD,$CE,$CF ;4
  1410. .BYTE $D0,$D1,$D2,$D3,$D4,$D5,$D6,$D7,$D8,$D9,$DA,$5B,$5C,$5D,$5E,$5F ;5
  1411. .BYTE $C0,$41,$42,$43,$44,$45,$46,$47,$48,$49,$4A,$4B,$4C,$4D,$4E,$4F ;6
  1412. .BYTE $50,$51,$52,$53,$54,$55,$56,$57,$58,$59,$5A,$DB,$DC,$DD,$DE,$DF ;7
  1413. .BYTE $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00 ;8
  1414. .BYTE $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00 ;9
  1415. .BYTE $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00 ;A
  1416. .BYTE $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00 ;B
  1417. .BYTE $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00 ;C
  1418. .BYTE $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00 ;D
  1419. .BYTE $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00 ;E
  1420. .BYTE $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00 ;F
  1421.  
  1422. TRANS┬UF╘O┴SCII = *
  1423.        ;0   1   2   3   4   5   6   7   8   9   A   B   C   D   E   F
  1424. .BYTE $00,$00,$00,$00,$00,$00,$00,$00,$00,$09,$00,$00,$00,$0D,$00,$00 ;0
  1425. .BYTE $00,$00,$00,$00,$08,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00 ;1
  1426. .BYTE $20,$21,$22,$23,$24,$25,$26,$27,$28,$29,$2A,$2B,$2C,$2D,$2E,$2F ;2
  1427. .BYTE $30,$31,$32,$33,$34,$35,$36,$37,$38,$39,$3A,$3B,$3C,$3D,$3E,$3F ;3
  1428. .BYTE $40,$61,$62,$63,$64,$65,$66,$67,$68,$69,$6A,$6B,$6C,$6D,$6E,$6F ;4
  1429. .BYTE $70,$71,$72,$73,$74,$75,$76,$77,$78,$79,$7A,$5B,$5C,$5D,$5E,$5F ;5
  1430. .BYTE $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00 ;6
  1431. .BYTE $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00 ;7
  1432. .BYTE $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00 ;8
  1433. .BYTE $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00 ;9
  1434. .BYTE $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00 ;A
  1435. .BYTE $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00 ;B
  1436. .BYTE $60,$41,$42,$43,$44,$45,$46,$47,$48,$49,$4A,$4B,$4C,$4D,$4E,$4F ;C
  1437. .BYTE $50,$51,$52,$53,$54,$55,$56,$57,$58,$59,$5A,$7B,$7C,$7D,$7E,$7F ;D
  1438. .BYTE $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00 ;E
  1439. .BYTE $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$7E ;F
  1440.  
  1441. ;====BSS STORAGE (SIZE=22,016 BYTES)====
  1442.  
  1443. BSS = *
  1444. TRACKBUF   = $6A00 ;(9216)  ;ROOM FOR 18 X 512-BYTE SECTORS
  1445. CLUSTER┬UF = $8E00 ;(1024)  ;2 SECTORS
  1446. FATBUF     = $9200 ;(4608)  ;9 SECTORS
  1447. DIRBUF     = $A400 ;(7168)  ;14 SECTORS = 224 DIRENTS
  1448.